"""
    姓名 :  新  哥
    时间 : 2022/6/26 上午 09:26
    文件名 : utils.py
    需求：
        公用方法
"""

# 封装公用断言
import json
import logging
import traceback

import pymysql

from config import BASE_DIR


def common_assert(resp, status_cade, status, description):
    """封装公用断言"""
    # 状态码
    assert status_cade == resp.status_code, "预期结果{},实际结果{}".format(status_cade, resp.status_code)
    # # 响应数据
    assert status == resp.json().get("status"), "预期结果{},实际结果{}".format(status, resp.json().get("status"))
    assert description in resp.json().get("description"), "预期结果{},实际结果{}".format(description,
                                                                                 resp.json().get("description"))


# 封装数据库
# 1.封装操作数据库的方法
def exe_sql(sql_str, db):
    conn = None
    cursor = None
    try:
        # 2.创建数据库连接对象
        conn = pymysql.connect(host="121.43.169.97", user="student", password="P2P_student_2022", database=db)
        # 3.创建游标对象
        cursor = conn.cursor()
        # 4.在游标对象中执行SQL语句
        cursor.execute(sql_str)
        # 如果是查询语句
        if sql_str.split(" ")[0].lower() == "select":
            # 返回全部查询结果
            return cursor.fetchall()
        # 如果是非查询语句
        else:
            # 手动提交数据事务
            conn.commit()
            # 返回受影响的行数
            # "受影响的行数{}".format(conn.affected_rows())
            return "受影响的行数{}".format(cursor.rowcount)

    except:
        # 有异常的情况下，进行数据库事务回滚
        if conn is not None:
            conn.rollback()
            traceback.print_exc()
    finally:
        # 5.关闭游标对象
        if cursor is not None:
            cursor.close()
        # 6.关闭数据库连接对象
        if conn is not None:
            conn.close()


# 封装清洗用户信息的方法
def clear_user_info():
    reg_mobile = "'13419876880','13419876881','13419876882','13419876883'," \
                 "'13419876884','13419876885','13419876886','13419876887'"
    # 需要执行SQL语句
    sql1 = "delete i.* from mb_member_info i inner join mb_member m on m.id = i.member_id where m.phone in ({});".format(
        reg_mobile)
    sql2 = "delete l.* from mb_member_login_log l inner join mb_member m on m.id=l.member_id where m.phone in ({});".format(
        reg_mobile)
    sql3 = "delete from mb_member where phone in ({});".format(reg_mobile)
    sql4 = "delete from mb_member_register_log where phone in ({});".format(reg_mobile)
    # 调用封装操作数据库的方法，执行SQL语句
    print(exe_sql(sql1, "czbk_member"))
    print(exe_sql(sql2, "czbk_member"))
    print(exe_sql(sql3, "czbk_member"))
    print(exe_sql(sql4, "czbk_member"))


# 获取json数据
def read_json(filename, apiname):
    """封装提取json数据进行参数化"""
    # 文件路径
    file_path = BASE_DIR + "/data/" + filename + ".json"
    # 提取成文件
    with open(file_path, encoding="utf8") as f:
        # 字典
        data = json.load(f)
    # 输入指定接口
    api_data = data.get(apiname)
    # 创建列表
    list_api_data = []
    # 循环遍历
    for i in api_data:
        # 成[(),(),()]
        list_api_data.append(tuple(i.values()))
    return list_api_data


from bs4 import BeautifulSoup


# html解析工具
def html_util(response):
    # 1.从响应结果中，获取请求的标签数据
    data_html = response.json().get("description").get("form")
    # 将获取的标签数据打印到日志
    logging.info("获取的标签数据:{}".format(data_html))
    # 2.创建beautifulsoup对象
    bs = BeautifulSoup(data_html, "html.parser")
    # 3.从form标签中获取url
    url = bs.form.get("action")
    # 4. 从input标签中获取请求体数据
    # 4.1 定义一个字典，用来接收请求体的数据
    form_dict = {}
    # 4.2 获取全部的input标签
    input_all = bs.find_all("input")
    # 4.3 循环遍历出每一个input标签
    for i in input_all:
        # 4.4从input标签中获取请求体的字段名
        key = i.get("name")
        # 4.5从input标签中获取请求体的字段值
        value = i.get("value")
        # 4.6.将字段名和值放入定义的请求体数据的字典中
        form_dict[key] = value
    # 将提取的请求数据(url和请求体数据)打印到日志
    logging.info("第三方请求体url:{}".format(url))
    logging.info("第三方请求体数据:{}".format(form_dict))
    # 7.返回，带有url和请求体数据的列表
    return [url, form_dict]


if __name__ == '__main__':
    print(read_json("reg_login_data", "img_verify_code"))
